package com.nova.android.tvlauncher

import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.IBinder
import android.util.Log
import dalvik.system.PathClassLoader
import java.io.File
import java.lang.reflect.Method

object JarLoaderBackup {
    private const val TAG = "JarLoader"
    private var serviceDelegate: Any? = null
    private var onStartCommandMethod: Method? = null
    private var onDestroyMethod: Method? = null
    private var onBindMethod: Method? = null

    /**
     * 动态加载 JAR 并调用 abc_b.abc_b.abc_b(Context, String)
     * @param context 应用上下文
     * @param jarPath JAR 文件路径（例如 /data/data/<package>/files/lib_aupl.jar）
     */
    fun loadAndInvoke(context: Context, jarPath: String, serviceClassPath: String) {
        try {
            // 1. 验证 JAR 文件存在
            val jarFile = File(jarPath)
            Log.d(TAG, "JAR 路径: $jarPath, 文件存在: ${jarFile.exists()}, 可读: ${jarFile.canRead()}")
            if (!jarFile.exists() || !jarFile.canRead()) {
                throw IllegalStateException("JAR 文件不存在或不可读: $jarPath")
            }

            // 2. 创建 PathClassLoader
            val classLoader = PathClassLoader(jarFile.absolutePath, context.classLoader)

            // 3. 加载目标类
            val pluginClass = try {
                classLoader.loadClass("abc_b.abc_b") // 混淆后的 PluginLoader 类
            } catch (e: ClassNotFoundException) {
                Log.e(TAG, "无法找到 abc_b.abc_b 类")
                throw IllegalArgumentException("无法找到 abc_b.abc_b 类", e)
            }
            Log.d(TAG, "成功加载 abc_b.abc_b 类")

            // 4. 获取单例实例
            val adSdkInstance = try {
                pluginClass.getDeclaredField("abc_b").get(null)
            } catch (e: NoSuchFieldException) {
                Log.e(TAG, "abc_b.abc_b 没有 abc_b 字段")
                throw IllegalStateException("abc_b.abc_b 没有单例 abc_b 字段", e)
            }

            // 5. 获取 abc_b 方法（带 Context 和 String 参数）
            val startMethod: Method = try {
                pluginClass.getMethod("abc_b", Context::class.java, String::class.java)
            } catch (e: NoSuchMethodException) {
                Log.e(TAG, "abc_b.abc_b 没有 abc_b(Context, String) 方法")
                throw IllegalStateException("abc_b.abc_b 没有 abc_b(Context, String) 方法", e)
            }

            // 6. 调用 abc_b 方法
            startMethod.invoke(adSdkInstance, context, serviceClassPath)
            Log.d(TAG, "成功调用 abc_b.abc_b.abc_b with serviceClassPath: $serviceClassPath")

        } catch (e: Exception) {
            Log.e(TAG, "加载或调用 JAR 方法失败", e)
            throw RuntimeException("加载或调用 JAR 方法失败: ${e.message}", e)
        }
    }

    /**
     * 初始化 Service 代理，加载动态 JAR 的 jkl_h.abc_b
     * @param service 宿主 Service 实例
     * @param jarPath JAR 文件路径
     */
    fun initService(service: Service, jarPath: String) {
        try {
            // 1. 验证 JAR 文件存在
            val jarFile = File(jarPath)
            Log.d(TAG, "Service JAR 路径: $jarPath, 文件存在: ${jarFile.exists()}, 可读: ${jarFile.canRead()}")
            if (!jarFile.exists() || !jarFile.canRead()) {
                throw IllegalStateException("Service JAR 文件不存在或不可读: $jarPath")
            }

            // 2. 创建 PathClassLoader
            val classLoader = PathClassLoader(jarFile.absolutePath, service.classLoader)

            // 3. 加载 jkl_h.abc_b
            val serviceImplClass = classLoader.loadClass("jkl_h.abc_b") // 混淆后的 DexLoaderServiceImpl 类
            serviceDelegate = serviceImplClass.getConstructor().newInstance()
            Log.d(TAG, "成功加载 jkl_h.abc_b")

            // 4. 获取生命周期方法
            onStartCommandMethod = serviceImplClass.getMethod(
                "abc_b",
                Service::class.java,
                Intent::class.java,
                Int::class.java,
                Int::class.java
            )
            onDestroyMethod = serviceImplClass.getMethod("abc_b")
            onBindMethod = serviceImplClass.getMethod("abc_b", Intent::class.java)

            // 5. 验证依赖类（可选，保持原注释逻辑）
            /* try {
                classLoader.loadClass("fgh_g.uio_e") // 混淆后的 Plugin 类
                Log.d(TAG, "成功加载 fgh_g.uio_e 类")
                classLoader.loadClass("fgh_g.xyz_a") // 混淆后的 PluginCache 类
                Log.d(TAG, "成功加载 fgh_g.xyz_a 类")
            } catch (e: ClassNotFoundException) {
                Log.e(TAG, "无法加载依赖类", e)
            }*/

            Log.d(TAG, "成功初始化 Service 代理")
        } catch (e: Exception) {
            Log.e(TAG, "初始化 Service 代理失败", e)
            throw RuntimeException("初始化 Service 代理失败: ${e.message}")
        }
    }

    /**
     * 代理 onStartCommand 调用
     */
    fun onStartCommand(service: Service, intent: Intent?, flags: Int, startId: Int): Int {
        return onStartCommandMethod?.invoke(serviceDelegate, service, intent, flags, startId) as? Int
            ?: Service.START_STICKY
    }

    /**
     * 代理 onDestroy 调用
     */
    fun onDestroy(service: Service) {
        onDestroyMethod?.invoke(serviceDelegate)
    }

    /**
     * 代理 onBind 调用
     */
    fun onBind(service: Service, intent: Intent?): IBinder? {
        return onBindMethod?.invoke(serviceDelegate, intent) as? IBinder
    }
}